package br.uvv.sao.managedBean;

import java.io.Serializable;
import java.util.ArrayList;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

import org.primefaces.event.UnselectEvent;

import br.uvv.sao.domain.PalavraChave;
import br.uvv.sao.rn.PalavraChaveRN;
import br.uvv.sao.util.MsgUtil;
import br.uvv.sao.util.RNException;

public class PalavraChaveBean implements Serializable{

	private static final long serialVersionUID = 2143437415089805985L;
	
	private PalavraChaveRN palavraChaveRN;
	
	private Boolean selecionado = false;
	
	private PalavraChave palavraChaveInstance;
	private PalavraChave palavraChaveInstanceTemp;
	private ArrayList<PalavraChave> palavraChaveList;
	
	public void setarNew(){
		palavraChaveInstance = palavraChaveInstanceTemp = new PalavraChave();
	}
	
	private void init(){
		palavraChaveRN = new PalavraChaveRN();
		palavraChaveInstance = new PalavraChave();
		selecionado = false;
		listar();
	}
	
	public String palavraChave(){
		init();
		return "goPalavrasChave";
	}
	
	public String goHome(){
		init();
		return "goHome";
	}
	
	//Fazer o list do autocomplete
	public void listar(){
		try {
			palavraChaveList = (ArrayList<PalavraChave>) palavraChaveRN.listar();
		} catch (RNException e) { }
		selecionado = false;
	}	
	
	public void salvar(){
		try {
			palavraChaveRN.salvar(palavraChaveInstance);
			MsgUtil.msgInfo("A Palavra Chave '" + palavraChaveInstance.getNome() + "' foi criada com sucesso!");
			init();
		} catch (Exception e) {
			MsgUtil.msgInfo("Ocorreu um erro ao criar a palavra chave '" + palavraChaveInstance.getNome() + "'!");
		}
	}
	
	public void atualizar(){
		try {
			palavraChaveRN.salvar(palavraChaveInstanceTemp);
			MsgUtil.msgInfo("A Palavra Chave '" + palavraChaveInstanceTemp.getNome() + "' foi atualizada com sucesso!");
			init();
		} catch (Exception e) {
			MsgUtil.msgInfo("Ocorreu um erro ao atualizar a palavra chave '" + palavraChaveInstanceTemp.getNome() + "'!");
		}
	}
	
	public void desativar(){
		try {
			palavraChaveRN.excluir(palavraChaveInstanceTemp);
			MsgUtil.msgInfo("A Palavra Chave '" + palavraChaveInstanceTemp.getNome() + "' foi desativada com sucesso!");
			init();
		} catch (Exception e) {
			MsgUtil.msgInfo("Ocorreu um erro ao desativar a palavra chave '" + palavraChaveInstanceTemp.getNome() + "'!");
		}
	}

	public void onRowUnselect(UnselectEvent uns){
		selecionado = false;
	}
	
	public void validateNome(FacesContext context, UIComponent toValidate, Object value) {  
		String nome = (String) value;
		Boolean temElementos = false;
		try {
			temElementos = palavraChaveRN.verificarNome(nome,palavraChaveInstanceTemp, selecionado);
		} catch (RNException e) {
			e.printStackTrace();
		}
	    if (!temElementos){
	        ((UIInput)toValidate).setValid(false);
	        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já existe uma palavra chave com este nome!", "");  
	        context.addMessage(toValidate.getClientId(context), message);  
	    }  
	}
	
	public PalavraChave getPalavraChaveInstance() {
		return palavraChaveInstance;
	}
	public void setPalavraChaveInstance(PalavraChave palavraChaveInstance) {
		this.palavraChaveInstance = palavraChaveInstance;
	}
	public ArrayList<PalavraChave> getPalavraChaveList() {
		return palavraChaveList;
	}
	public void setPalavraChaveList(ArrayList<PalavraChave> palavraChaveList) {
		this.palavraChaveList = palavraChaveList;
	}
	public Boolean getSelecionado() {
		return selecionado;
	}
	public void setSelecionado(Boolean selecionado) {
		this.selecionado = selecionado;
	}
	public PalavraChave getPalavraChaveInstanceTemp() {
		return palavraChaveInstanceTemp;
	}
	public void setPalavraChaveInstanceTemp(
			PalavraChave palavraChaveInstanceTemp) {
		selecionado = true;
		this.palavraChaveInstanceTemp = palavraChaveInstanceTemp;
	}
}
